#pragma once

#include <functional>
#include <vector>
// #include <string>
// #include <memory>

#include "./EventLoopThread.h" // 需要包含否则 static_assert(sizeof(_Tp)>0,
// #include "../common/Noncopyable.h"
//  #include "../ConsistenHash.h"

class EventLoop;
class EventLoopThread;

class EventLoopThreadPool : Noncopyable
{
public:
    using ThreadInitCallback = std::function<void(EventLoop *)>;

    EventLoopThreadPool(EventLoop *baseLoop, const std::string &name);
    // OPTIMIZE: 析构没有其他处理用c++11的default
    ~EventLoopThreadPool() = default;

    // const std::string name() const { return name_; }
    std::string getName() const;
    bool getIsStart() const;
    std::vector<EventLoop *> getLoops() const;

    void setThreadNum(const size_t threadNum);
    // 用户线程初始化回调可能未用到
    void start(const ThreadInitCallback &cb = ThreadInitCallback{});

    // 多线程mainLoop默认轮询分配Channel给subLoop
    EventLoop *getNextLoop();
    // EventLoop *getNextLoop(const std::string &key);

private:
    EventLoop *mainLoop_; // 用户创建并传入的loop，线程数为1直接使用用户创建的loop，否则创建多Loop
    std::string name_;    // 用户指定名称，EventLoopThreadPool->EventLoopThread和Thread根据数量再修改名称

    bool isStart_;
    size_t threadNum_;
    size_t loopIndex_; // 新连接到，选择loop的索引，先选再++

    std::vector<std::unique_ptr<EventLoopThread>> threads_;
    std::vector<EventLoop *> loops_;
    // ConsistentHash hash_;    // 一致性哈希对象
};